﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;

namespace ExtensionMixinDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            // Mixins gefa manni t.d sama möguleika á að búa til embedded DSL og Ruby:
            Console.WriteLine("Í dag er {0}", 0.Days().FromNow());
            Console.WriteLine("Eftir 3 daga er {0}", 3.Days().FromNow());
            Console.ReadKey();
            Console.WriteLine("Foobar dulkóðað verður {0}", "Foobar".Encode());
            Console.ReadKey();
        }
    }

    static class Extensions
    {
        public static Byte[] StringBytes(this String s)
        {
            var converter = new UnicodeEncoding();
            return converter.GetBytes(s);
        }

        public static String StringBytes(this Byte[] b)
        {
            var converter = new UnicodeEncoding();
            return converter.GetString(b);
        }

        public static String Encode(this String s)
        {
            var crypto = new RSACryptoServiceProvider();
            return crypto.Encrypt(s.StringBytes(), true).StringBytes();
        }

        public static String Decode(this String s)
        {
            var crypto = new RSACryptoServiceProvider();
            return crypto.Decrypt(s.StringBytes(), true).StringBytes();
        }

    }

    /// <summary>
    /// Smekksatriði hvort við flokkum extensions í extension klasa eftir klasa eða tilgangi
    /// eða einfaldlega höfum þá alla í sama klasa, sbr Extensions hér að ofan.
    /// </summary>
    static class TimeExtensions
    {
        public static TimeSpan Days(this int days)
        {
            return new TimeSpan(days, 0, 0, 0);
        }

        public static DateTime FromNow(this TimeSpan timeSpan)
        {
            return DateTime.Now.Add(timeSpan);
        }
    }
}
